home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / gfx / misc / gnuplot-3.7src.lha / gnuplot-3.7src / gnuplot-3.7.lha / gnuplot-3.7 / term / pbm.trm < prev    next >
Text File  |  1998-12-15  |  11KB  |  438 lines

  1. /*
  2.  * $Id: pbm.trm,v 1.19 1998/06/18 14:59:21 ddenholm Exp $
  3.  *
  4.  */
  5.  
  6. /* GNUPLOT - pbm.trm */
  7.  
  8. /*[
  9.  * Copyright 1990 - 1993, 1998
  10.  *
  11.  * Permission to use, copy, and distribute this software and its
  12.  * documentation for any purpose with or without fee is hereby granted,
  13.  * provided that the above copyright notice appear in all copies and
  14.  * that both that copyright notice and this permission notice appear
  15.  * in supporting documentation.
  16.  *
  17.  * Permission to modify the software is granted, but not the right to
  18.  * distribute the complete modified source code.  Modifications are to
  19.  * be distributed as patches to the released version.  Permission to
  20.  * distribute binaries produced by compiling modified sources is granted,
  21.  * provided you
  22.  *   1. distribute the corresponding source modifications from the
  23.  *    released version in the form of a patch file along with the binaries,
  24.  *   2. add special version identification to distinguish your version
  25.  *    in addition to the base release version number,
  26.  *   3. provide your name and address as the primary contact for the
  27.  *    support of your modified version, and
  28.  *   4. retain our contact information in regard to use of the base
  29.  *    software.
  30.  * Permission to distribute the released version of the source code along
  31.  * with corresponding source modifications in the form of a patch file is
  32.  * granted with same provisions 2 through 4 for binary distributions.
  33.  *
  34.  * This software is provided "as is" without express or implied warranty
  35.  * to the extent permitted by applicable law.
  36. ]*/
  37.  
  38. /*
  39.  * This file is included by ../term.c.
  40.  *
  41.  * This terminal driver supports:
  42.  *  pbm
  43.  *
  44.  * AUTHORS
  45.  *  Russell Lang
  46.  *
  47.  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
  48.  * 
  49.  */
  50.  
  51. /* The following pbmplus drivers use the generic bit mapped graphics
  52.    routines from bitmap.c to build up a bit map in memory.  The driver
  53.    interchanges colomns and lines in order to access entire lines
  54.    easily and returns the lines to get bits in the right order :
  55.    (x,y) -> (y,XMAX-1-x). */
  56. /* This interchange is done by calling b_makebitmap() with reversed 
  57.    xmax and ymax, and then setting b_rastermode to TRUE.  b_setpixel()
  58.    will then perform the interchange before each pixel is plotted */
  59. /* See Jef Poskanzer's excellent PBMplus package for more details of
  60.    the Portable BitMap format and for programs to convert PBM files  
  61.    to other bitmap formats. */
  62.  
  63. #include "driver.h"
  64.  
  65. #ifdef TERM_REGISTER
  66. register_term(pbm_driver)
  67. #endif
  68.  
  69. #ifdef TERM_PROTO
  70. TERM_PUBLIC void PBMoptions __PROTO((void));
  71. TERM_PUBLIC void PBMinit __PROTO((void));
  72. TERM_PUBLIC void PBMreset __PROTO((void));
  73. TERM_PUBLIC void PBMsetfont __PROTO((void));
  74. TERM_PUBLIC void PBMgraphics __PROTO((void));
  75. TERM_PUBLIC void PBMmonotext __PROTO((void));
  76. TERM_PUBLIC void PBMgraytext __PROTO((void));
  77. TERM_PUBLIC void PBMcolortext __PROTO((void));
  78. TERM_PUBLIC void PBMtext __PROTO((void));
  79. TERM_PUBLIC void PBMlinetype __PROTO((int linetype));
  80. TERM_PUBLIC void PBMpoint __PROTO((unsigned int x, unsigned int y, int point));
  81. #endif /* TERM_PROTO */
  82.  
  83. #ifdef TERM_BODY
  84.  
  85. /* make XMAX and YMAX a multiple of 8 */
  86. #define PBM_XMAX (640)
  87. #define PBM_YMAX (480)
  88. #define PBM_VCHAR (FNT5X9_VCHAR)
  89. #define PBM_HCHAR (FNT5X9_VCHAR)
  90. #define PBM_VTIC FNT5X9_HBITS
  91. #define PBM_HTIC FNT5X9_HBITS
  92.  
  93. static int pbm_font = 1;    /* small font */
  94. static int pbm_mode = 0;    /* 0:monochrome 1:gray 2:color */
  95.  
  96. /* 7=black, 0=white */
  97. static int pgm_gray[] = { 7, 1, 6, 5, 4, 3, 2, 1, 7 };    /* grays  */
  98. /* bit3=!intensify, bit2=!red, bit1=!green, bit0=!blue */
  99. static int ppm_color[] ={ 15, 8, 3, 5, 6, 2, 4, 1, 11, 13, 14 };  /* colors */
  100.  
  101. TERM_PUBLIC void PBMoptions()
  102. {
  103.     pbm_font = 1;
  104.     pbm_mode = 0;
  105.  
  106.     term_options[0] = NUL;
  107.  
  108.     while (!END_OF_COMMAND) {
  109.     if (almost_equals(c_token, "s$mall"))
  110.         pbm_font = 1;
  111.     else if (almost_equals(c_token, "me$dium"))
  112.         pbm_font = 2;
  113.     else if (almost_equals(c_token, "l$arge"))
  114.         pbm_font = 3;
  115.     else if (almost_equals(c_token, "mo$nochrome"))
  116.         pbm_mode = 0;
  117.     else if (almost_equals(c_token, "g$ray"))
  118.         pbm_mode = 1;
  119.     else if (almost_equals(c_token, "c$olor")
  120.          || almost_equals(c_token, "c$olour"))
  121.         pbm_mode = 2;
  122.     else {
  123.         /* reset to default, since term is already set */ 
  124.         pbm_font = 1;
  125.         pbm_mode = 0;
  126.         int_error("expecting: {small, medium, large} and {monochrome, gray, color}", c_token);
  127.     }
  128.     c_token++;
  129.     }
  130.  
  131.     /* setup options string */
  132.  
  133.     switch (pbm_font) {
  134.     case 1:
  135.     strcat(term_options, "small");
  136.     break;
  137.     case 2:
  138.     strcat(term_options, "medium");
  139.     break;
  140.     case 3:
  141.     strcat(term_options, "large");
  142.     break;
  143.     }
  144.  
  145.     switch (pbm_mode) {
  146.     case 0:
  147.     strcat(term_options, " monochrome");
  148.     break;
  149.     case 1:
  150.     strcat(term_options, " gray");
  151.     break;
  152.     case 2:
  153.     strcat(term_options, " color");
  154.     break;
  155.     }
  156. }
  157.  
  158.  
  159. TERM_PUBLIC void PBMinit()
  160. {
  161.     PBMsetfont();        /* HBB 980226: call it here! */
  162. }
  163.  
  164.  
  165. TERM_PUBLIC void PBMreset()
  166. {
  167. #ifdef VMS
  168.     fflush_binary();
  169. #endif /* VMS */
  170. }
  171.  
  172.  
  173. TERM_PUBLIC void PBMsetfont()
  174. {
  175.     switch (pbm_font) {
  176.     case 1:
  177.     b_charsize(FNT5X9);
  178.     term->v_char = FNT5X9_VCHAR;
  179.     term->h_char = FNT5X9_HCHAR;
  180.     term->v_tic = FNT5X9_HBITS;
  181.     term->h_tic = FNT5X9_HBITS;
  182.     break;
  183.     case 2:
  184.     b_charsize(FNT9X17);
  185.     term->v_char = FNT9X17_VCHAR;
  186.     term->h_char = FNT9X17_HCHAR;
  187.     term->v_tic = FNT9X17_HBITS;
  188.     term->h_tic = FNT9X17_HBITS;
  189.     break;
  190.     case 3:
  191.     b_charsize(FNT13X25);
  192.     term->v_char = FNT13X25_VCHAR;
  193.     term->h_char = FNT13X25_HCHAR;
  194.     term->v_tic = FNT13X25_HBITS;
  195.     term->h_tic = FNT13X25_HBITS;
  196.     break;
  197.     }
  198. }
  199.  
  200.  
  201. TERM_PUBLIC void PBMgraphics()
  202. {
  203.     int numplanes = 1;
  204.  
  205.     switch (pbm_mode) {
  206.     case 1:
  207.     numplanes = 3;
  208.     break;
  209.     case 2:
  210.     numplanes = 4;
  211.     break;
  212.     }
  213.  
  214.     /* HBB 980226: this is not the right place to do this: setfont() influences
  215.      * fields of the termtable entry, and therefore must be called by init()
  216.      * already. */
  217.     /* PBMsetfont(); */
  218.     /* rotate plot -90 degrees by reversing XMAX and YMAX and by 
  219.        setting b_rastermode to TRUE */
  220.     b_makebitmap((unsigned int) (PBM_YMAX * ysize),
  221.          (unsigned int) (PBM_XMAX * xsize), numplanes);
  222.     b_rastermode = TRUE;
  223.  
  224.     if (pbm_mode != 0)
  225.     b_setlinetype(0);    /* solid lines */
  226. }
  227.  
  228.  
  229. static void PBMmonotext()
  230. {
  231.     register int x, j, row;
  232.  
  233.     fputs("P4\n", gpoutfile);
  234.     fprintf(gpoutfile, "%u %u\n", b_ysize, b_xsize);
  235.  
  236.     /* dump bitmap in raster mode */
  237.     for (x = b_xsize - 1; x >= 0; x--) {
  238.     row = (b_ysize / 8) - 1;
  239.     for (j = row; j >= 0; j--) {
  240.         (void) fputc((char) (*((*b_p)[j] + x)), gpoutfile);
  241.     }
  242.     }
  243.  
  244.     b_freebitmap();
  245. }
  246.  
  247. static void PBMgraytext()
  248. {
  249.     register int x, j, row;
  250.     register int i, value;
  251.     int mask, plane1, plane2, plane3;
  252.  
  253.     fprintf(gpoutfile, "\
  254. P5\n\
  255. %u %u\n\
  256. %u\n",
  257.         b_ysize, b_xsize,
  258.         255);
  259.  
  260.     /* dump bitmap in raster mode */
  261.     for (x = b_xsize - 1; x >= 0; x--) {
  262.     row = (b_ysize / 8) - 1;
  263.     for (j = row; j >= 0; j--) {
  264.         mask = 0x80;
  265.         plane1 = (*((*b_p)[j] + x));
  266.         plane2 = (*((*b_p)[j + b_psize] + x));
  267.         plane3 = (*((*b_p)[j + b_psize + b_psize] + x));
  268.         for (i = 0; i < 8; i++) {
  269.         /* HBB: The values below are set to span the full range
  270.          * from 0 up to 255 in 7 steps: */
  271.         value = 255;
  272.         if (plane1 & mask)
  273.             value -= 36;
  274.         if (plane2 & mask)
  275.             value -= 73;
  276.         if (plane3 & mask)
  277.             value -= 146;
  278.         (void) fputc((char) (value), gpoutfile);
  279.         mask >>= 1;
  280.         }
  281.     }
  282.     }
  283.  
  284.     b_freebitmap();
  285. }
  286.  
  287. static void PBMcolortext()
  288. {
  289.     register int x, j, row;
  290.     register int i;
  291.     int mask, plane1, plane2, plane3, plane4;
  292.     int red, green, blue;
  293.  
  294.     fprintf(gpoutfile, "P6\n\
  295. %u %u\n\
  296. %u\n",
  297.         b_ysize, b_xsize,
  298.         255);
  299.  
  300.     /* dump bitmap in raster mode */
  301.     for (x = b_xsize - 1; x >= 0; x--) {
  302.     row = (b_ysize / 8) - 1;
  303.     for (j = row; j >= 0; j--) {
  304.         mask = 0x80;
  305.         plane1 = (*((*b_p)[j] + x));
  306.         plane2 = (*((*b_p)[j + b_psize] + x));
  307.         plane3 = (*((*b_p)[j + b_psize + b_psize] + x));
  308.         plane4 = (*((*b_p)[j + b_psize + b_psize + b_psize] + x));
  309.         for (i = 0; i < 8; i++) {
  310.         red = (plane3 & mask) ? 1 : 3;
  311.         green = (plane2 & mask) ? 1 : 3;
  312.         blue = (plane1 & mask) ? 1 : 3;
  313.         if (plane4 & mask) {
  314.             red--;
  315.             green--;
  316.             blue--;
  317.         }
  318.         /* HBB: '85' is exactly 255/3, so this spans the full
  319.          * range of colors in three steps: */
  320.         (void) fputc((char) (red * 85), gpoutfile);
  321.         (void) fputc((char) (green * 85), gpoutfile);
  322.         (void) fputc((char) (blue * 85), gpoutfile);
  323.         mask >>= 1;
  324.         }
  325.     }
  326.     }
  327.  
  328.     b_freebitmap();
  329. }
  330.  
  331. TERM_PUBLIC void PBMtext()
  332. {
  333.     switch (pbm_mode) {
  334.     case 0:
  335.     PBMmonotext();
  336.     break;
  337.     case 1:
  338.     PBMgraytext();
  339.     break;
  340.     case 2:
  341.     PBMcolortext();
  342.     break;
  343.     }
  344. }
  345.  
  346.  
  347. TERM_PUBLIC void PBMlinetype(linetype)
  348. int linetype;
  349. {
  350.     switch (pbm_mode) {
  351.     case 0:
  352.     b_setlinetype(linetype);
  353.     break;
  354.     case 1:
  355.     if (linetype >= 7)
  356.         linetype %= 7;
  357.     b_setvalue(pgm_gray[linetype + 2]);
  358.     break;
  359.     case 2:
  360.     if (linetype >= 9)
  361.         linetype %= 9;
  362.     b_setvalue(ppm_color[linetype + 2]);
  363.     break;
  364.     }
  365. }
  366.  
  367. TERM_PUBLIC void PBMpoint(x, y, point)
  368. unsigned int x, y;
  369. int point;
  370. {
  371.     if (pbm_mode == 0)
  372.     line_and_point(x, y, point);
  373.     else
  374.     do_point(x, y, point);
  375. }
  376.  
  377. #endif /* TERM_BODY */
  378.  
  379. #ifdef TERM_TABLE
  380.  
  381. #define PBMmove b_move
  382. #define PBMvector b_vector
  383. #define PBMtext_angle b_text_angle
  384. #define PBMput_text b_put_text
  385.  
  386. TERM_TABLE_START(pbm_driver)
  387.     "pbm", "Portable bitmap [small medium large] [monochrome gray color]",
  388.     PBM_XMAX, PBM_YMAX, PBM_VCHAR,
  389.     PBM_HCHAR, PBM_VTIC, PBM_HTIC, PBMoptions,
  390.     PBMinit, PBMreset, PBMtext, null_scale,
  391.     PBMgraphics, PBMmove, PBMvector, PBMlinetype,
  392.     PBMput_text, PBMtext_angle, null_justify_text, PBMpoint,
  393.     do_arrow, set_font_null,
  394.     0,                /* pointsize */
  395.     TERM_CAN_MULTIPLOT | TERM_BINARY
  396. TERM_TABLE_END(pbm_driver)
  397.  
  398. #undef LAST_TERM
  399. #define LAST_TERM pbm_driver
  400.  
  401. #endif /* TERM_TABLE */
  402.  
  403.  
  404. #ifdef TERM_HELP
  405. START_HELP(pbm)
  406. "1 pbm",
  407. "?commands set terminal pbm",
  408. "?set terminal pbm",
  409. "?set term pbm",
  410. "?terminal pbm",
  411. "?term pbm",
  412. "?pbm",
  413. " Several options may be set in the `pbm` terminal---the driver for PBMplus.",
  414. "",
  415. " Syntax:",
  416. "       set terminal pbm {<fontsize>} {<mode>}",
  417. "",
  418. " where <fontsize> is `small`, `medium`, or `large` and <mode> is `monochrome`,",
  419. " `gray` or `color`.  The default plot size is 640 pixels wide and 480 pixels",
  420. " high; this may be changed by `set size`.",
  421. "",
  422. " The output of the `pbm` driver depends upon <mode>: `monochrome` produces a",
  423. " portable bitmap (one bit per pixel), `gray` a portable graymap (three bits",
  424. " per pixel) and `color` a portable pixmap (color, four bits per pixel).",
  425. "",
  426. " The output of this driver can be used with Jef Poskanzer's excellent PBMPLUS",
  427. " package, which provides programs to convert the above PBMPLUS formats to GIF,",
  428. " TIFF, MacPaint, Macintosh PICT, PCX, X11 bitmap and many others.  PBMPLUS may",
  429. " be obtained from ftp.x.org.  The relevant files have names that begin with",
  430. " \"netpbm-1mar1994.p1\"; they reside in /contrib/utilities.  The package can",
  431. " probably also be obtained from one of the many sites that mirrors ftp.x.org.",
  432. "",
  433. " Examples:",
  434. "       set terminal pbm small monochrome             # defaults",
  435. "       set size 2,2; set terminal pbm color medium"
  436. END_HELP(pbm)
  437. #endif /* TERM_HELP */
  438.